#版本四：具体研究：
# import time
# def index():
#     '''有很多代码.....'''
#     time.sleep(2) # 模拟的网络延迟或者代码效率
#     print('欢迎登录博客园首页')
#
# def timmer(f):
#     f = index#不影响inner里的f，自由变量
#     # f = <function index at 0x0000023BA3E8A268>
#     def inner():
#         start_time = time.time()
#         f()
#         end_time = time.time()
#         print(f'测试本函数的执行效率{end_time-start_time}')
#     return inner
# index=timmer(index)
# index()


#版本五：,被装饰函数返回值无法返回
# import time
#
# def timmer(f):
#     def inner():
#         start_time = time.time()
#         f()
#         end_time = time.time()
#         print(f'测试本函数的执行效率{end_time-start_time}')
#     return inner
# @timmer#index=timmer(index)
# def index():
#     '''有很多代码.....'''
#     time.sleep(2) # 模拟的网络延迟或者代码效率
#     print('欢迎登录博客园首页')
#     return 666
# ret=index()--index是inner
# print(ret)#None
#
# def diary():
#     time.sleep(3)
#     print('欢迎登录日记页面')
#     return 666
#
# diary=timmer(diary)
# diary()

#版本六:,被装饰函数带返回值

import time
# timmer装饰器
def timmer(f):
    # f = index
    def inner():
        start_time = time.time()
        # print(f'这是个f():{f()}!!!') # index()
        r = f()
        end_time = time.time()
        print(f'测试本函数的执行效率{end_time-start_time}')
        return r
    return inner

@timmer # index = timmer(index)
def index():
    '''有很多代码.....'''
    time.sleep(0.6) # 模拟的网络延迟或者代码效率
    print('欢迎登录博客园首页')
    return 666
# 加上装饰器不应该改变原函数的返回值，所以666 应该返回给我下面的ret，
# 但是下面的这个ret实际接收的是inner函数的返回值，而666返回给的是装饰器里面的
# f() 也就是 r,我们现在要解决的问题就是将r给inner的返回值。
ret = index()  # inner()
print(ret)


# 版本八： 被装饰函数带返回值

import time
def timmer(f):
    # f = index
    def inner(*args,**kwargs):
        #  函数的定义：* 聚合  args = ('李舒淇',18)
        start_time = time.time()
        # print(f'这是个f():{f()}!!!') # index()
        r = f(*args,**kwargs)
        # 函数的执行：* 打散：f(*args) --> f(*('李舒淇',18))  --> f('李舒淇',18)
        end_time = time.time()
        print(f'测试本函数的执行效率{end_time-start_time}')
        return r
    return inner

@timmer # index = timmer(index)
def index(name):
    '''有很多代码.....'''
    time.sleep(0.6) # 模拟的网络延迟或者代码效率
    print(f'欢迎{name}登录博客园首页')
    return 666
@timmer
def diary(name,age):
    time.sleep(0.6)
    print(f'{name}今年{age}岁了')
    return 666

index('纳钦')  # inner('纳钦')
diary('AK',18)


def wrapper(f):
    def innder(*args,**kwargs):
        '''额外功能,被执行装饰函数之前的操作'''
        r=f(*args,**kwargs)
        '''添加额外功能：执行被装饰函数之后的操作'''
        print(args,kwargs)
        print('inner函数')
        return r
    return innder

@wrapper
def test(name,age,subject,grade):
    print(f'{name}今年{age}岁了,考了{subject}{grade}分')
    return name,age,subject,grade
ret=test('AK',18,subject='English',grade=100)
print(ret,type(ret))





























